package hotel;

import java.io.*;
import java.sql.*;

import java.util.*;

import javax.swing.*;

public class Database {
	private Connection conn;
	public Statement stat;
	static ImageIcon iconax = new ImageIcon("Risorse/iconax.png");

	public Database() throws SQLException, IOException {
		conn = getConnection();
		stat = conn.createStatement();
	}

	public void iniz() throws SQLException, IOException {
		try {
			String clienti = "CREATE TABLE CLIENTI ("
					+ "codice INT AUTO_INCREMENT," + "nome VARCHAR(20),"
					+ "cognome VARCHAR(20)," + "datadinascita DATE,"
					+ "comunedinascita VARCHAR(20),"
					+ "provinciadinascita VARCHAR(2),"
					+ "residenza VARCHAR(20),"
					+ "provinciadiresidenza VARCHAR(2),"
					+ "tipodidocumento VARCHAR(20),"
					+ "numerodidocumento VARCHAR(15),"
					+ "rilasciatoda VARCHAR(30)," + "datadirilascio DATE,"
					+ "datadiarrivo DATE," + "indirizzo VARCHAR(100),"
					+ "email VARCHAR(30)," + "presente BOOLEAN DEFAULT 0,"
					+ "PRIMARY KEY(codice)," + "UNIQUE(numerodidocumento))";
			String camere = "CREATE TABLE CAMERE ("
					+ "codice INT AUTO_INCREMENT," + "numero VARCHAR(10),"
					+ "numeroposti INT," + "numpostioccupati INT,"
					+ "matrimoniale BOOLEAN," + "stato VARCHAR(20),"
					+ "prezzo VARCHAR(8)," + "PRIMARY KEY(codice),"
					+ "UNIQUE(numero))";
			String associazione = "CREATE TABLE ASSOCIAZIONE("
					+ "numerodocumento VARCHAR(15),"
					+ "camera VARCHAR(10),"
					+ "prezzo VARCHAR(8),"
					+ "datadipartenza DATE,"
					+ "PRIMARY KEY (numerodocumento,camera),"
					+ "UNIQUE(numerodocumento),"
					+ "FOREIGN KEY(numerodocumento) REFERENCES CLIENTI(numerodidocumento),"
					+ "FOREIGN KEY(camera) REFERENCES CAMERE(numero))";
			String storico = "CREATE TABLE STORICO("
					+ "numerodocumento VARCHAR(15),"
					+ "numcamera VARCHAR(10),"
					+ "dataarrivo DATE,"
					+ "datapartenza DATE,"
					+ "prezzo VARCHAR(5),"
					+ "PRIMARY KEY (numerodocumento,dataarrivo),"
					+ "FOREIGN KEY(numerodocumento) REFERENCES CLIENTI(numerodidocumento)," +
						"FOREIGN KEY(numcamera) REFERENCES CAMERE(numero))";
			String prenotazioni = "CREATE TABLE PRENOTAZIONI("
					+ "camera VARCHAR(10)," + "dal DATE," + "al DATE,"
					+ "nominativo VARCHAR(20),"
					+ "PRIMARY KEY (camera,dal,al),"
					+ "FOREIGN KEY (camera) REFERENCES CAMERE(numero))";
			stat.execute(clienti);
			stat.execute(camere);
			stat.execute(associazione);
			stat.execute(storico);
			stat.execute(prenotazioni);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public int query(String query) throws SQLException, IOException {
		int fatto = 0;
		try {
			stat.execute(query);
			fatto = 1;
		} catch (SQLException e) {
			return e.getErrorCode();
		}
		return fatto;
	}

	public void chiudiConnessione() throws SQLException {
		conn.close();
	}

	public boolean rimuoviCliente(String numeroDocumento) {
		boolean fatto = false;
		try {
			stat.execute("DELETE FROM STORICO WHERE numerodocumento='"
					+ numeroDocumento + "'");
			stat.execute("DELETE FROM CLIENTI WHERE numerodidocumento='"
					+ numeroDocumento + "'");
			fatto = true;
		} catch (SQLException e) {
			e.printStackTrace();
			if (e.getErrorCode() == 1451)
				JOptionPane.showMessageDialog(null,
						"Togliere prima il cliente dalla stanza!", "Errore",
						JOptionPane.WARNING_MESSAGE, iconax);
		}
		return fatto;
	}

	public boolean rimuoviCamera(String numeroCamera) {
		boolean fatto = false;
		try {
			stat.execute("DELETE FROM prenotazioni WHERE camera='"
					+ numeroCamera + "'");
			stat.execute("DELETE FROM STORICO WHERE numcamera='" + numeroCamera
					+ "'");
			stat.execute("DELETE FROM CAMERE WHERE numero='" + numeroCamera
					+ "'");
			fatto = true;
		} catch (SQLException e) {
			if (e.getErrorCode() == 1451) {
				JOptionPane.showMessageDialog(null,
						"Stanza al momento occupata!", "Attenzione",
						JOptionPane.WARNING_MESSAGE, iconax);
			}
			if (e.getErrorCode() == 1451)
				JOptionPane.showMessageDialog(null,
						"La camera deve essere vuota per essere eliminata!",
						"Errore", JOptionPane.WARNING_MESSAGE, iconax);
		}
		return fatto;
	}

	public ResultSet cercaPerCognome(String cognome) throws SQLException {
		return stat.executeQuery("SELECT * INTO CLIENTI WHERE cognome='"
				+ cognome + "'");
	}
	
	public ResultSet cercaQuery(String query){
		try {
			return stat.executeQuery(query);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}

	public ResultSet cercaPerNome(String nome) throws SQLException {
		return stat.executeQuery("SELECT * INTO CLIENTI WHERE nome='" + nome
				+ "'");
	}

	public ResultSet cercaPerNumeroDocumento(String documento)
			throws SQLException {
		return stat
				.executeQuery("SELECT * INTO CLIENTI WHERE numerodidocumento='"
						+ documento + "'");
	}

	public void stampaQuery(String query) throws SQLException, IOException {
		try {
			ResultSet result = stat.executeQuery(query);
			while (result.next()) {
				System.out.println(result.getString(1) + " "
						+ result.getString(2));// mostra solo nome e cognome
			}
		} catch (SQLException e) {
			System.out.println("Sintassi errata");
		}
	}

	public Connection getConnection() throws SQLException, IOException {
		Properties props = new Properties();
		FileInputStream in = new FileInputStream("Risorse/database.properties");
		props.load(in);
		in.close();
		String drivers = props.getProperty("jdbc.drivers");
		String url = props.getProperty("jdbc.url");
		String username = props.getProperty("jdbc.username");
		String password = props.getProperty("jdbc.password");
		if (drivers != null)
			System.setProperty("jdbc.drivers", drivers);
		return DriverManager.getConnection(url, username, password);
	}

	public boolean rimuoviPrenotazione(String camera, String dal, String al) {
		boolean fatto = false;
		try {
			String dal1 = dal.substring(6) + "/" + dal.substring(3, 5) + "/"
					+ dal.substring(0, 2);
			String al1 = al.substring(6) + "/" + al.substring(3, 5) + "/"
					+ al.substring(0, 2);
			String query = "DELETE FROM prenotazioni WHERE camera='" + camera
					+ "' && dal='" + dal1 + "' && al='" + al1 + "'";
			stat.execute(query);
			fatto = true;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return fatto;
	}
	
}
